/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.naotebuk.controller;

import br.com.naotebuk.dao.ConsertoDao;
import br.com.naotebuk.modelo.Conserto;
import br.com.naotebuk.modelo.Produto;
import br.com.naotebuk.modelo.Situacao;
import br.com.naotebuk.modelo.TipoProduto;
import br.com.naotebuk.propertyEditor.ProdutoPropertyEditor;
import br.com.naotebuk.propertyEditor.SituacaoPropertyEditor;
import br.com.naotebuk.propertyEditor.TipoProdutoPropertyEditor;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

/**
 *
 * @author giovanni
 */
@Transactional
@Controller
public class ConsertoController {
    
    @Autowired
    private ConsertoDao dao;
    
    @Autowired
    JavaMailSender mailSender;
    
    @InitBinder
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
        binder.registerCustomEditor(Produto.class, new ProdutoPropertyEditor(dao));
        binder.registerCustomEditor(TipoProduto.class, new TipoProdutoPropertyEditor(dao));
        binder.registerCustomEditor(Situacao.class, new SituacaoPropertyEditor(dao));
    }
    
    @RequestMapping("novoPedido")
    public String form(Conserto conserto, Model model) {

        model.addAttribute("tipos", dao.listarTiposDeProduto());
        
        return "conserto/formulario";
    }
    
    @RequestMapping("adicionaConserto")
    public String adiciona(@Valid Conserto conserto, BindingResult result, Model model) {
        
        conserto.setDataEntrada(new Date());
        conserto.setSituacao(dao.situacaoPorNome("Aberto"));

//        if (result.hasFieldErrors("email")) {
//            return "cliente/formulario";
//        }
        
        dao.adiciona(conserto);
        model.addAttribute("sucesso", "true");
        model.addAttribute("mensagem", "Pedido de conserto incluído com sucesso!");

        return "index";
    }

    @RequestMapping("alteraConserto")
    public String altera(Conserto conserto, BindingResult result, final RedirectAttributes redirectAttributes) {
        dao.altera(conserto);
        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Pedido de Conserto alterado com sucesso!");

        return "redirect:listaConsertos";
    }

    @RequestMapping("listaConsertos")
    public String lista(Model model, HttpServletRequest request) {

        Date de = formataData(request.getParameter("de"));
        Date ate = formataData(request.getParameter("ate"));
        String numero = request.getParameter("numero");
        List<Conserto> consertos = new ArrayList<Conserto>();

        if(numero != null && !numero.equals("")){
            
            consertos.add(dao.buscaPorId(Integer.parseInt(numero)));
            if(consertos.size() > 0){
                model.addAttribute("consertos", consertos);
            }
            return "conserto/lista";
        }else if(de != null && ate != null){
            consertos = dao.listaEntreDatas(de, ate);
            model.addAttribute("consertos", consertos);
            return "conserto/lista";
        }else if((de == null) ^ (ate == null)){
            Date from = (de == null)? formataData("01/01/2000"): de;
            Date to = (ate == null)? new Date() : ate;

            consertos = dao.listaEntreDatas(from, to);
            model.addAttribute("consertos", consertos);
            return "conserto/lista";
        }

        consertos = dao.lista();
        model.addAttribute("consertos", consertos);

        return "conserto/lista";
    }
    
    @RequestMapping("mostraConserto")
    public String mostra(Integer id, Model model) {
        Conserto conserto = dao.buscaPorId(id);
        model.addAttribute("tipos", dao.listarTiposDeProduto());
        model.addAttribute("conserto", conserto);
        model.addAttribute("situacoes", dao.listarSituacoes());
        return "conserto/mostra";
    }    
    
    @RequestMapping("atualizarConserto")
    public String atualizar(Integer id, Model model) {
        Conserto conserto = dao.buscaPorId(id);
        model.addAttribute("conserto", conserto);
        model.addAttribute("atualizar", true);
        return "conserto/mostra";
    }    
    
    @RequestMapping("realizarConserto")
    public String realizar(Conserto conserto, BindingResult result, final RedirectAttributes redirectAttributes) {
        Conserto c = dao.buscaPorId(conserto.getId());
        c.setObservacao(conserto.getObservacao());
        c.setPrecoEntrega(conserto.getPrecoEntrega());
        c.setSituacao(dao.situacaoPorNome("À Retirar"));
        dao.altera(c);
        enviarEmail(c);
        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Conserto realizado com sucesso!");
        return "redirect:listaConsertosEmAberto";
    }    
    
    @RequestMapping("removeConserto")
    public String remove(Integer id, final RedirectAttributes redirectAttributes) {
        dao.remove(dao.buscaPorId(id));
        redirectAttributes.addFlashAttribute("sucesso", "true");
        redirectAttributes.addFlashAttribute("mensagem", "Pedido de conserto removido com sucesso!");
        return "redirect:listaConsertos";
    }
    
    @RequestMapping("listaConsertosEmAberto")
    public String consertosEmAberto(Model model){
        try {
            model.addAttribute("consertos", dao.listarConsertosEmAberto());
        } catch (RuntimeException e) {
            model.addAttribute("erroBusca", true);
            model.addAttribute("mensage,", "Nenhum pedido de conserto encontrado!");
        }finally{
            return "conserto/lista-abertos";
        }
    }
    
    @RequestMapping("listaConsertosEmAtraso")
    public String consertosEmAtraso(Model model){
        try {
            model.addAttribute("consertos", dao.listarConsertosEmAtraso());
        } catch (RuntimeException e) {
            model.addAttribute("erroBusca", true);
            model.addAttribute("mensage,", "Nenhum pedido de conserto encontrado!");
        }finally{
            return "conserto/lista-atrasados";
        }
    }
    
    @RequestMapping("listaConsertosARetirar")
    public String consertosARetirar(Model model){
        try {
            model.addAttribute("consertos", dao.listarConsertosARetirar());
        } catch (RuntimeException e) {
            model.addAttribute("erroBusca", true);
            model.addAttribute("mensage,", "Nenhum pedido de conserto encontrado!");
        }finally{
            return "conserto/lista-a-retirar";
        }
    }
    
    @RequestMapping("finalizarConserto")
    public String finalizarConserto(Integer id, Model model){
        Conserto conserto = dao.buscaPorId(id);
        conserto.setSituacao(dao.situacaoPorNome("Pago"));
        conserto.setDataEntrega(new Date());
        
        dao.altera(conserto);
        
        return "conserto/finalizado";
    }
    
    @RequestMapping("detalheConserto")
    public String detalheConserto(Integer id, Model model) {
        Conserto conserto = dao.buscaPorId(id);
        model.addAttribute("conserto", conserto);
        model.addAttribute("cliente", conserto.getCliente());
        model.addAttribute("produto", conserto.getProduto());
        return "conserto/detalhe";
    }

    
    private void enviarEmail(Conserto conserto) throws MailException{

        SimpleMailMessage email = new SimpleMailMessage();
        String genero =  conserto.getCliente().getSexo().equals("M")?"Sr.":"Sra.";
        String mensagem = " Olá "+genero+" "+conserto.getCliente().getNomeCompleto()+",\n"
                + "vimos por meio deste informar que o seu equipamento "+conserto.getProduto().getNome()
                +" está pronto para ser retirado!\n O custo do serviço foi: R$ "+conserto.getPrecoEntrega()
                +".\nAgradecemos a preferência. - Nãotebuk Assitência Técnica";
        email.setTo(conserto.getCliente().getEmail());
        email.setSubject("[Nãotebuk]- Conserto Realizado");
        email.setText(mensagem);

        mailSender.send(email);
    }
    
    private Date formataData(String data) {   
        
        if (data == null || data.equals(""))  
            return null;  
          
        Date date = null;  
        DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");  
        try {  
            date = (Date)formatter.parse(data);
        } catch (ParseException ex) {
            return null;
        }
        return date;  
    }
}
